package com.fu.interceptor;

import java.util.ArrayList;
import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.fu.config.TokenCache;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import com.fu.utils.CheckUtils;

/**
 * 
 * @ClassName: ApiCheckInterceptor
 * @Description: 请求参数校验拦截器
 * @author Little Ant
 * @date 2017年10月31日上午11:37:58
 */
@Component
public class ApiCheckInterceptor implements HandlerInterceptor {

	@Autowired
	TokenCache tokenCache;

	/**
	 * 不予拦截的请求地址列表
	 */
	private static List<String> IGNORE_URL_LIST = new ArrayList<>();

	static {
		// 类初始化时添加信任地址列表
		IGNORE_URL_LIST.add("/api/v1.0/auth/token");
	}

	@Override
	public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object object,
			Exception exception) throws Exception {
		// 在整个请求结束之后被调用，也就是在DispatcherServlet 渲染了对应的视图之后执行（主要是用于进行资源清理工作）

	}

	@Override
	public void postHandle(HttpServletRequest request, HttpServletResponse response, Object object, ModelAndView mView)
			throws Exception {
		// 请求处理之后进行调用，但是在视图被渲染之前（Controller方法调用之后）

	}

	@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object object) throws Exception {
		// 在请求处理之前进行调用（Controller方法调用之前） TODO 需添加各种状态码及其描述,日志记录处理时间
		String url = request.getRequestURI();
		if (IGNORE_URL_LIST.contains(url)) {
			return true;
		}
		String token = request.getParameter("token");
		if (!tokenCache.exist(token)){
			return false;
		}
		return "ok".equals(CheckUtils.requestCheck(request));
	}

}
